#!/usr/bin/perl

### Version non modularisé de Tempis
### Encodage : UTF-8 (sans BOM)

### Dernière modification : 24 avril 2006



# Tempis a pour rôle d'être d'utilité érgonomique.
# 
# Il traduit le suppôt de satan qu'est Tempus (www.ufr.univ-montp2.fr:8080)
# en plusieurs formats respectueux des standards (oui toujours eux),
# c'est déjà ça ; en prime il offre non pas une gamme de couteaux semi-chef,
# mais des présentations qui sont agréables à regarder et utiliser.
# Oui Mademoiselle ! Oui Monsieur ! Attention il est maintenant possible de lire
# votre emplois-du-temps d'un seul regard, et pour les plus fous, de
# l'apprécier (*outch*).
#
# Dans l'immense générosité du Lama (et la notre), Tempis offre des langages
# qui ont le vent en poupe, et ô comble, qui peuvent s'avérer
# particulièrement utiles.
#
# Nos vedettes sont :
#   xhtml 1.0, avec de jolies css 2.1 ;
#   rss 0.91, 1.0, 2.0 (atome ne sera sûrment jamais supporté) ;
#   wap (y'en a un qui ricane au fond) mais bogué ;
#   iMode ;
#   iCal (et la foule est en délire ! Utilisateurs de calendars, bienvenu) ;
#   xml, avec un doctype interne ;
#
# 'tention d'autre peuvent venir (mais le mogueur a l'œil vif, le poile soyeux,
# mais le courage d'une moule marinière sur une côte bretonne).
#
# Ce beau monde est sous licence GNU GPL 2.0 ;
# cette source est fermée par sa seule lisibilité (nous avons utilisé perl pour 
# crypter le code, oui je sais c'est vache).



#___________________________________________________________________ INCLUDES __
use strict;
use CGI;
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use LWP::Simple;
#use Digest::MD5 qw(md5_hex);
#use Data::Dumper;
#_______________________________________________________________ includes end __


#_______________________________________________________________________ DATA __

# Noms des diplomes connus par Tempis et présents sur Tempus
my @diplist;
@diplist = (
'CAPES MATHS',
'CAPES PHYSIQUE CHIMIE',
'CAPES SVT',
'CNAM',
'DAEU B',
'ENSEIGNEMENTS DIVERS',
'IAE',
'IUP BBB AN 2',
'IUP BBB AN 3',
'IUP GC AN 2',
'IUP GC AN 3',
'IUP GEII Optoélectronique',
'IUP GMI AN 2',
'IUP GMI AN 3',
'IUP GMP AN 3',
'IUT Chimie',
'L1 Biologie Série 1',
'L1 Biologie Série 2',
'L1 Biologie Série 3',
'L1 Biologie Série 4',
'L1 L2 Option Culture Générale',
'L1 STE',
'L1 STPI',
'L1CHI',
'L1INFO',
'L1MATH',
'L1PHYS',
'L2 BIOLOGIE BIOPHY',
'L2 BIOLOGIE Série 1',
'L2 BIOLOGIE Série 2',
'L2 CHIMIE',
'L2 CHIMIE parcours PAC',
'L2 INFORMATIQUE~',
'L2 MATHEMATIQUES',
'L2 PHYSIQUE',
'L2 STE',
'L2 STPI',
'L2 SV Concours',
'L3 Psychophysiologie',
'L3 STPI Aéronautique',
'LIC BIO - P.V.A',
'Lic ST Chimie Pro PAC L3',
'LICENCE BIOLOGIE (P.A)',
'LICENCE DE BIOCHIMIE',
'LICENCE DE BIOLOGIE-BGST',
'LICENCE DE BIOLOGIE-ORG',
'LICENCE DE CHIMIE',
'LICENCE DE CHIMIE PHYSIQU',
'LICENCE DE MATHEMATIQUES',
'LICENCE DE PHYSIQUE',
'LICENCE DE PHYSIQUE - PA',
'LICENCE EEA',
'LICENCE INFORMATIQUE',
'LICENCE INGEN. ELECTRIQUE',
'LICENCE SC. PHYSIQUES',
'M1 BGAE',
'M1 BGAE BAEMT',
'M1 BGAE BBB',
'M1 BGAE BFP',
'M1 BGAE BIMP',
'M1 BGAE EBE',
'M1 BGAE EBE Parcours SVT',
'M1 BGAE IEGB',
'M1 BGAE PARC',
'M1 BS Biologie Sante',
'M1 Didactique des sciences',
'M1 IMS Informatique pour les S',
'M1 IMS Mathematique',
'M1 IMS Recherche en Informatiq',
'M1 PC Chimie et Physiquo chimi',
'M1 PC Ingénierie Biomol',
'M1 PC Physique Ingenierie des ',
'M1 PC Physique Recherche',
'M1 Psycologie cognitive',
'M1 STPI ENCS & SAEI',
'M2 BG Gestion Littoraux Mers',
'M2 BGAE',
'M2 BGAE BFP',
'M2 BGAE BIMP',
'M2 BGAE HGA',
'M2 BGAE HGA pro GERE',
'M2 BGAE IEGB',
'M2 BS Nutrition Pro',
'M2 IMS Info pour les Sciences',
'M2 IMS Informatique Pro',
'M2 IMS PRO Biostatistique',
'M2 PC Chim Physico Chim Mat',
'M2 PC PHYMATECH',
'M2 PC Physique Informatique',
'M2 PC PRO BCS3',
'M2 PC Pro SASA',
'M2 PC Recherche Biomoléculaire',
'M2 PC spé CAP BIO',
'M2 STPI CIM',
'M2 STPI ENCS R',
'M2 STPI Optoélectronique',
'Master EPHE',
'PMI L1',
'Service Commun d\'Act Culturel',
);

# CSS applicables uniquement à la version html
my @csslist = ('none.css','default.css','printer.css','mauche.css');

# Plusieurs noms pour les jours, c'est cooool
my @daylist = ('Lundi','Mardi','Mercredi','Jeudi','Vendredi');
my @grodaylist = ('Lendi','Mordi','Credi','Joudi','Dredi');
#___________________________________________________________________ data end __



#___________________________________________________________________ GET/POST __
# Récupération des variables CGIs
my $cgi = new CGI;

# Groupe du module (format actuel : A, B, C, ...)
my $groupe = $cgi->param('groupe');
$groupe = '' if ( $groupe !~ m/^[a-zA-Z0-9_-]+$/ );

# Diplome : Est donné son indice dans @diplist (modulo taille diplist)
my $dipid = $cgi->param('diplome');
$dipid = '32' if ( $dipid !~ m/^\d+$/ ); #32
$dipid %= $#diplist+1;
my $diplome = join(' ',map(ucfirst,split(/ /,lc($diplist[$dipid]))));

# Semaine : Postion de la semaine a générer (0 semaine courante)
my $weekshift = $cgi->param('weekshift');
$weekshift = '-1' if ( $weekshift !~ m/^-?\d+$/ );

# BlackList : Nom des modules, tout module présent dans cette liste sera ignoré
my $blacklist = lc($cgi->param('blacklist')).' ';

# CSS : Uniquement pour la sortie html.
# Est donné son indice dans @csslist (modulo taille @csslist)
my $cssid = $cgi->param('cssid');
$cssid= '01' if ( $cssid !~ m/^\d+$/ );
$cssid %= $#csslist+1;
my $cssname = $csslist[$cssid];

# Format de sortie.
# Demande un format de sortie particulier selon l'entier envoyé
# Voir les format disponnibles plus loin. Format par defaut : html.
my $format = $cgi->param('format');
$format = 0 if ($format !~ m/^\d+$/);


# URL du script plus paramtres CGI, privé de l'attribut format.
$cgi->delete('format');
my $fullUrl = $cgi->self_url;
#_______________________________________________________________ post/get end __



#_________________________________________________________________ GENERATION __
# Calcul de la semaine en cours
my @date;
@date = localtime;
my $wday =  $date[6];
@date = localtime(time - ($weekshift*-7+($wday-1))*3600*24);
my $date1=$date[3].'/'.($date[4]+1).'/'.($date[5]+1900);
@date = localtime(time + ($weekshift*7+(5-$wday))*3600*24);
my $date2=$date[3].'/'.($date[4]+1).'/'.($date[5]+1900);
undef @date;

# Calculate request md5
#my $digest = md5_hex($groupe,$dipid,$blacklist,$date1);
# Si on trouve un fichier avec le md5 correspondant,
# et qui a moins de 5min d'ancienneté, on le charge
# il contient une version @cours (dumpée avec Dumper)
# Sinon on utilise les fonction de getter vues plus
# haut et on enregistre leur résultat dans un fichier
# avec ce md5 pour la fois suivante...

# La serie de procedures ...
my $html_data;
&get_html_data();
my @dataray;
&parse_html_data();
undef $html_data;
my @cours;
&parse_dataray(@dataray);
undef @dataray;

# Génération du code du format de sortie
#if    ($format == 8) {&print_yaml  (@cours);} #         : 
if    ($format == 7) {&print_imode (@cours);} #html     : chtml
elsif ($format == 6) {&print_xml   (@cours);} #xml      : maison
elsif ($format == 5) {&print_ical  (@cours);} #calendar : iCal
elsif ($format == 4) {&print_rss20 (@cours);} #feed     : RSS 2.0
elsif ($format == 3) {&print_rss10 (@cours);} #feed     : RSS 1.0
elsif ($format == 2) {&print_rss091(@cours);} #feed     : RSS 0.91
elsif ($format == 1) {&print_wml   (@cours);} #wml      : wap
else                 {&print_html  (@cours);} #html     : xhtml
#_____________________________________________________________ generation end __



#======================================================================= SUB ===


#______________________________________________________________ GET HTML DATA __
# Recupère la page voulue généré sur Tempus (page suivante comprise)

sub get_html_data () # Ca ca marche ...
{
	# $html_data est définie juste avant l'appel de get_html_data
	my $useragent;
	my $request;
	my @content;
	my @footer;
	$useragent = LWP::UserAgent->new();
	utf8::decode($diplome); #XXX si ça bug ça peut venir de là.
	
	# tempis est particulièrement coquin il aime rajouter des tildes un peu 
	# partout ; si le diplome n'existe pas, le diplome "tildéifié"
	# le sera peut être
	my $sended = 0;
	while(1) {
		$request = POST 'http://www.ufr.univ-montp2.fr:8080/4DCGI/search_Etp.4DP',
							[ UserKey => '0',
								ResponsePage   => 'search_Etp.html',
								vtWeb_OblCM    => '1',
								vtWeb_OblTP    => '1',
								vtWeb_OblTD    => '1',
								vtWeb_OptCM    => '1',
								vtWeb_OptTP    => '1',
								vtWeb_OptTD    => '1',
								vtWeb_Mode     => '2',
								vtWeb_Mode     => '1',
								submit         => 'Rechercher',
								vtWeb_Date1    => $date1 ,
								vtWeb_Date2    => $date2 ,
								vtWeb_Name_Etp => $diplome ,
								vtWeb_Group    => $groupe ];
		@content = split(/<\/table>\s*<\/div>\s*<div id='...._Find'>\s*<table>/
						,$useragent->request($request)->as_string);
	
		if (!$sended && $content[1]=~/ne correspond pas &agrave; un nom d'&eacute;tape/i)
		{
			$sended=1;
			$diplome .= '~';
		} else {last};
	}
	
	$html_data .= $content[1]; #On ajoute a l'html data le body_Find
	if ( $#content > 1 ) #Si y'a un foot_Find ( et donc des pages suivantes )
		{
		map
			{
				s/'.*//;
				@footer = split(/<\/table>\s*<\/div>\s*<div id='...._Find'>\s*<table>/
								,get('http://www.ufr.univ-montp2.fr:8080'.$_));
				$html_data .= $footer[1];
			}
			split(/href='/,$content[2]);
		}
		#print Dumper($html_data);
}
#__________________________________________________________ get html data end __



#____________________________________________________________ PARSE HTML DATA __
sub parse_html_data () #Ok
{
	my $day;
	my $line;
	# $html_data est affectée par get_html_data
	
	# Splitage par jour
	@dataray = split(/\s*<tr>\s*<td[^>]*><span[^>]*>(\w+)<\/span><\/td>\s*<td colspan='8'><\/td>\s*<\/tr>\s*<tr>\s*/
				,$html_data);
	shift @dataray;
	
	# Ajout des jours vides si necessaires
	for (my $i=0;$i<=4;$i++)
	{
		if ( $dataray[$i] cmp $daylist[$i] )
			{
				my @tmp = ('',$dataray[$i]);
				splice(@dataray,$i,1,@tmp);
			}
		else
			{
				splice(@dataray,$i,1);
			}
	}
	
	# Splitage par ligne
	map { $_ = [ split /(?:<\/span><\/td>)?\s*<\/tr>\s*<tr>\s*(?:<td[^>]*><span[^>]*>)?(?:<td colspan='15'[^>]*><img[^>]*><\/td>)?/ ] } @dataray;
	
	# Splitage par colonne
	for $day ( @dataray )
	{
		map { $_ = [ split /(?:<\/span><\/td>)?\s*(?:<td[^>]*><img[^>]*><\/td>)?\s*<td[^>]*><span[^>]*>/, $_, -1 ] } @$day;
	}
	#shift @dataray;
	for $day ( @dataray )
	{
		my $fl = $$day[0];
		shift @$fl; # pas trouve comment eviter la variable $fl..
			pop @$day;
	}
}
#_________________________________________________________ parse html data end__



#______________________________________________________________ PARSE DATARAY __
sub parse_dataray () # Ca c bon
{
	my $day;
	for $day ( @_ ) # pour chaque jour
	{
		my @dayout;
		my $c = {};
		my $line;
		for $line ( @$day ) # pour chaque ligne du tableau
		{
			next if ( $#$line != 8 ); # on evite les lignes vides (colspan=15)
			if ( $$line[0] ne '' ) # Debut d'un cours
			{
				
				if ( $c->{Nom} ) # Si ya un precedent
				{
					# On envoie le cours precedent dans la liste
					&cleanup_names($c);
					push @dayout, $c;
					$c = {};
				}
				# puis on build le suivant
				($c->{Debut},$c->{Fin}) = split / - /,$$line[0];
				map { s/:/h/ } ($c->{Debut},$c->{Fin});
				$c->{Type} = $$line[1].$$line[2].$$line[3];
				($c->{Module},$c->{Nom}) = split / /,$$line[6],2;
				map { s/(\d\d)h(\d\d)(\d\d)h(\d\d)/$c->{Duree} = (($3-$1)*60+$4-$2).'m'/e } $c->{Debut}.$c->{Fin};
				$c->{Salle} = $$line[8];
			}
			else
			{
				# Si c'est pas une ligne a heure, on complete celui en cours
				$c->{Nom} .= $$line[6] if ( $$line[6] );
				$c->{Salle} .= ', '.$$line[8] if ( $$line[8] );
			}
		}
		# On envoie le dernier ...
		&cleanup_names($c);
		push @dayout, $c;
		# Filtrage des cours non-desires
		if ( length($blacklist) > 1 ) #$blacklist contient au minimum un caratere
		{
			for (my $i=0;$i<=$#dayout;)
			{
				my $m = \$dayout[$i]->{Module};
				my $match = ($blacklist =~ m/$$m /i);
				# Pas forcement la meilleur methode, voir s'il ne faut pas faire
				# un expept_group (ainsi on aurait /$$m / et /$$m. / repectivement
				# pour les deux groupes).
				if ((!$match or $except) and ($dayout[$i]->{Groupe}))
				{
					$match = 1;
					my @groupes = split(',',$dayout[$i]->{Groupe});
					my $g;
					for $g (@groupes)
					{
						# Pour les matières multi-groupes, 
						# elles ne sont éffacées que si tout les groupes 
						# sont dans la blacklist.
						$match = ($match &&
										($blacklist =~ m/$$m$g /i));
					}
				}
				
				if ($match)
				{
					splice(@dayout,$i,1);
				}
				else
				{
					$i++;
				}
			}
		}
		# Et calcul des slotcounts,slotpos
		&arrange_blocks(@dayout);
	}
}
#_________________________________________________________ parse html data end__



#______________________________________________________________ CLEANUP NAMES __
sub cleanup_names () # Cha marche ...
{
	my ($c) = @_;
	($c->{Nom},$c->{Groupe}) = split / - +gr\. (?:GR)?/i,$c->{Nom}; # Seul moment ou on remplit le groupe
		delete $c->{Groupe} if ( lc($groupe) =~ m/lc($c->{Groupe})/ );
	$c->{Nom} =~ s/ ,/,/g;
	$c->{Nom} =~ s/ ?\/ ?/ \/ /g;
	$c->{Nom} =~ s/ et( |$)/ &amp; /g;
	$c->{Nom} =~ s/(?:Licence . -)|(?:Semestre . -)//g;
	$c->{Nom} =~ s/(?:rammation)|(?:rithme)|(?:qiue)|(?:(?:am)?ique)|(?:tecture)|(?:bilites)|(?:logie)s?/./ig;
	$c->{Nom} = join(' ',map(ucfirst,split(/ /,lc($c->{Nom}))));

	$c->{Salle} =~ s/(?:RMATIQUE)|(?:IQUE?)|(?:OGIE)|(?:IE)|(?:OLY)|(?:Salle du )//i;
	$c->{Salle} =~ s/SC(?:IE)?NCES TERRE/ST/;

	# clean des tilds
	$c->{Nom}    =~ s/~$//;
	$c->{Salle}  =~ s/~$//;
	$c->{Module} =~ s/~$//;
	$c->{Type}   =~ s/~$//;
	$diplome     =~ s/~$//;
	$groupe      =~ s/~$//;

	my $str;
	for $str ( %$c )
	{
		$str =~ s/[\t\n\r\f'"<>\*]//g;
	}
}
#__________________________________________________________ cleanup names end __



#_____________________________________________________________ ARRANGE BLOCKS __

sub arrange_blocks () # Nickel !
{
	my @unfinished;

# Je considere que les cours sont déja ranges par heure de debut
# Sinon y'a ca (enfin je crois ^^):
# @_ = sort {$a->{Start} cmp $b->{Start}} @_;

# Premiere passe... ( on regle les slotpos )
	my $c;
	for $c ( @_ )
	{
		my $i;
		for $i ( 0 .. 1+$#unfinished )
		{
			if ( defined $unfinished[$i] )
			{ 
				if ( ($unfinished[$i]->{Fin} cmp $c->{Debut}) != 1 )
				{
					undef $unfinished[$i];
					my $j;
					for ($j=$#unfinished;$j>=0;$j--)
					{
						last if ( defined $unfinished[$j] );
					}
					$#unfinished = $j;
				}
			}
		}
		ONCE: for $i ( 0 .. 1+$#unfinished )
		{
			unless ( defined $unfinished[$i] )
			{
				$unfinished[$i] = $c;
				$c->{Slotpos} = 1+$i;
				$c->{Slotcount} = 1+$#unfinished;
				last ONCE;
			}
		}
	}

	# Deuxieme passe ( ajustons les slotcount )
	for (my $i=$#_;$i>0;$i--)
	{
		if ( $_[$i]->{Debut} < $_[$i-1]->{Fin} ) # Si ils sont en collision
		{
			if ( ($_[$i]->{Slotcount} > $_[$i-1]->{Slotcount}) )
			{
				$_[$i-1]->{Slotcount} = $_[$i]->{Slotcount};
			}
		}
	}
	# On ajoute le jour a la listeu ...
	push @cours, [@_];
}
#__________________________________________________________ arrange blocks end__



#==================================================================== SORTIES ==


#_________________________________________________________________ PRINT HTML __
sub print_html () # Facile ca...
{

print <<"END_OF_BLOCK";
Content-type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
	
	<link rel="alternate" type="application/rss+xml"  title="EDT de la semaine (RSS 2.0)"   href="$fullUrl&amp;format=4" />
	<link rel="alternate" type="application/rss+xml"  title="EDT de la semaine (RSS 1.0)"   href="$fullUrl&amp;format=3" />
	<link rel="alternate" type="application/rss+xml"  title="EDT de la semaine (RSS 0.91)"  href="$fullUrl&amp;format=2" />
	<title>
END_OF_BLOCK
print	'		Emploi du temps du '.$date1.' au '.$date2.' - '.$diplome;
print ' - Groupe '.$groupe if ( $groupe );
print <<"END_OF_BLOCK";

	</title>
	<link rel="stylesheet" type="text/css" href="$cssname" />
</head>
<body>
END_OF_BLOCK
print	'<dl id="liste_jours"';
print ' class="un_seul_groupe"' if ($groupe);
print '>';
print <<"END_OF_BLOCK";

		<dt class="legende_heures">Heures de debut et fin de cours</dt>
		<dd id="liste_heures">
			<ol>
				<li class="heure_08h00">08:00 - 09:30</li>
				<li class="heure_09h45">09:45 - 11:15</li>
				<li class="heure_11h30">11:30 - 13:00</li>
				<li class="heure_13h15">13:15 - 14:45</li>
				<li class="heure_15h00">15:00 - 16:30</li>
				<li class="heure_16h45">16:45 - 18:15</li>
				<li class="heure_18h30">18:30 - 20:00</li>				
			</ol>
		</dd>
END_OF_BLOCK
my $d;
for $d ( 0 .. $#daylist )
	{
my $current = (($weekshift==0)&&($d==(-1+$wday))) ? 'current' : '';
	print <<"END_OF_BLOCK";
		<dt class="nom_jour j_$daylist[$d] $current">
			<span class="jour_france">$daylist[$d]</span>
			<span class="jour_groland">$grodaylist[$d]</span>
		</dt>
		<dd class="infos_jour j_$daylist[$d] $current">
			<dl class="liste_cours">
END_OF_BLOCK
			my $dd = $_[$d];
			my $c;
			for $c ( @$dd )
				{
					print <<"END_OF_BLOCK";
				<dt class="heure_cours">$c->{Debut} - $c->{Fin}</dt>
				<dd class="infos_cours type_$c->{Type} heure_$c->{Debut} duree_$c->{Duree} slotpos_$c->{Slotpos} slots_$c->{Slotcount}" title="$c->{Debut}: ($c->{Module}) $c->{Nom}">
					<ul>
						<li class="nom">$c->{Nom}</li>
						<li class="salle">$c->{Salle}</li>
						<li class="module">$c->{Module}</li>
END_OF_BLOCK
print '						<li class="groupe" title="'.$c->{Groupe}.'">'.$c->{Groupe}.'</li>' if ( $c->{Groupe} );
print <<"END_OF_BLOCK";

					</ul>
				</dd>
END_OF_BLOCK
				}
	print	<<"END_OF_BLOCK";
			</dl>
		</dd>
END_OF_BLOCK
}

print <<"END_OF_BLOCK";
	</dl>
</body>
</html>
END_OF_BLOCK
}
#_____________________________________________________________ print html end __



#______________________________________________________________ PRINT RSS .91 __
sub print_rss091 ()
{
print <<"END_OF_BLOCK";
Content-type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns="http://my.netscape.com/rdf/simple/0.9/">
  
	<channel>
		<title>Tempis : $diplome</title>
		<link>http://tempis.deuxfleurs.org/</link>
		<description>Emploi du temps du $date1 au $date2 - $diplome
END_OF_BLOCK
print ' - Groupe '.$groupe if ( $groupe );
print <<"END_OF_BLOCK";
	</description>
	</channel>
END_OF_BLOCK


my $d;
for $d ( 0 .. $#daylist )
	{
	print <<"END_OF_BLOCK";
		<item>
			<title>$daylist[$d]</title>
			<link><![CDATA[$fullUrl]]></link>
			<description>
END_OF_BLOCK
			my $dd = $_[$d];
			my $c;
			for $c ( @$dd )
				{
					print <<"END_OF_BLOCK";
				<![CDATA[
				<dl>
					<dt class="heure_cours">$c->{Debut} - $c->{Fin}</dt>
					<dd class="infos_cours type_$c->{Type} heure_$c->{Debut} duree_$c->{Duree} slotpos_$c->{Slotpos} slots_$c->{Slotcount}" title="$c->{Debut}: ($c->{Module}) $c->{Nom}">
						<ul>
							<li class="nom">$c->{Nom}</li>
							<li class="salle">$c->{Salle}</li>
							<li class="module">$c->{Module}</li>
END_OF_BLOCK
print '							<li class="groupe" title="'.$c->{Groupe}.'">'.$c->{Groupe}.'</li>' if ( $c->{Groupe} );
print <<"END_OF_BLOCK";

						</ul>
					</dd>
				</dl>
				]]>
END_OF_BLOCK
				}
print "			</description>\n";
print "		</item>\n\n";
}

print '</rdf:RDF>';
}
#__________________________________________________________ print rss .91 end __



#______________________________________________________________ PRINT RSS 0.1 __
sub print_rss10 ()
{
print <<"END_OF_BLOCK";
Content-type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/">
  
	<channel rdf:about="http://tempis.deuxfleurs.org/">
		<title>Tempis : $diplome</title>
		<link>http://tempis.deuxfleurs.org/</link>
		<description>Emploi du temps du $date1 au $date2 - $diplome
END_OF_BLOCK
print ' - Groupe '.$groupe if ( $groupe );
print <<"END_OF_BLOCK";
	</description>
		
		<items>
		<rdf:Seq>
			<rdf:li resource="http://tempis.deuxfleurs.org/#0" />
			<rdf:li resource="http://tempis.deuxfleurs.org/#1" />
			<rdf:li resource="http://tempis.deuxfleurs.org/#2" />
			<rdf:li resource="http://tempis.deuxfleurs.org/#3" />
			<rdf:li resource="http://tempis.deuxfleurs.org/#4" />
			</rdf:Seq>
		</items>
	</channel>
END_OF_BLOCK


my $d;
for $d ( 0 .. $#daylist )
	{
	print <<"END_OF_BLOCK";
		<item rdf:about="http://tempis.deuxfleurs.org/#$d">
			<title>$daylist[$d]</title>
			<link><![CDATA[$fullUrl]]></link>
			<description>
END_OF_BLOCK
			my $dd = $_[$d];
			my $c;
			for $c ( @$dd )
				{
					print <<"END_OF_BLOCK";
				<![CDATA[
				<dl>
					<dt class="heure_cours">$c->{Debut} - $c->{Fin}</dt>
					<dd class="infos_cours type_$c->{Type} heure_$c->{Debut} duree_$c->{Duree} slotpos_$c->{Slotpos} slots_$c->{Slotcount}" title="$c->{Debut}: ($c->{Module}) $c->{Nom}">
						<ul>
							<li class="nom">$c->{Nom}</li>
							<li class="salle">$c->{Salle}</li>
							<li class="module">$c->{Module}</li>
END_OF_BLOCK
print '							<li class="groupe" title="'.$c->{Groupe}.'">'.$c->{Groupe}.'</li>' if ( $c->{Groupe} );
print <<"END_OF_BLOCK";

						</ul>
					</dd>
				</dl>
				]]>
END_OF_BLOCK
				}
print "			</description>\n";
print "		</item>\n\n";
}

print '</rdf:RDF>';
}
#__________________________________________________________ print rss 1.0 end __



#______________________________________________________________ PRINT RSS 2.0 __
sub print_rss20 ()
{
print <<"END_OF_BLOCK";
Content-type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Tempis : $diplome</title>
		<link>http://tempis.deuxfleurs.org/</link>
		<description>Emploi du temps du $date1 au $date2 - $diplome
END_OF_BLOCK
print ' - Groupe '.$groupe if ( $groupe );
print "</description>\n\n";


my $d;
for $d ( 0 .. $#daylist )
	{
	print <<"END_OF_BLOCK";
		<item>
			<title>$daylist[$d]</title>
			<link><![CDATA[$fullUrl]]></link>
			<description>
END_OF_BLOCK
			my $dd = $_[$d];
			my $c;
			for $c ( @$dd )
				{
					print <<"END_OF_BLOCK";
				<![CDATA[
				<dl>
					<dt class="heure_cours">$c->{Debut} - $c->{Fin}</dt>
					<dd class="infos_cours type_$c->{Type} heure_$c->{Debut} duree_$c->{Duree} slotpos_$c->{Slotpos} slots_$c->{Slotcount}" title="$c->{Debut}: ($c->{Module}) $c->{Nom}">
						<ul>
							<li class="nom">$c->{Nom}</li>
							<li class="salle">$c->{Salle}</li>
							<li class="module">$c->{Module}</li>
END_OF_BLOCK
print '							<li class="groupe" title="'.$c->{Groupe}.'">'.$c->{Groupe}.'</li>' if ( $c->{Groupe} );
print <<"END_OF_BLOCK";

						</ul>
					</dd>
				</dl>
				]]>
END_OF_BLOCK
				}
print "			</description>\n";
print "		</item>\n\n";
}

print <<"END_OF_BLOCK";
	</channel>
</rss>
END_OF_BLOCK
}
#__________________________________________________________ print rss 2.0 end __



#__________________________________________________________________ PRINT WML __
sub print_wml ()
{
my $d = $wday - 1;
my $i = 0;
my $j = 0;
my $dd = $_[$d];
my $c;

print <<"END_OF_BLOCK";
Content-type: text/vnd.wap.wml

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
	<card id="home" title="EDT du $daylist[$d]">
		<p>
END_OF_BLOCK
	
	for $c ( @$dd )
	{
		$j++;
		print '		<a href="#card'.$j.'">'.$c->{Debut}.' - '.$c->{Fin}.'</a> : '.$c->{Salle};
		print ' - '.$c->{Groupe} if ($c->{Groupe});
		print '<br/>';
	}
	print "		</p>\n</card>";
	for $c ( @$dd )
	{
		print <<"END_OF_BLOCK";
	
	<card id="card$i" title="$c->{Debut} - $c->{Fin}">
		<p>
			$c->{Module} : $c->{Salle}<br/>
			$c->{Nom}<br/>
END_OF_BLOCK
		
		$i++;
		print $c->{Groupe}.'<br/>' if ($c->{Groupe});
		print "		</p>\n";
		print '<do label="Cours suivant" type="accept"><go href="#card'.($i+1).'"/></do>' if ($i<$j);
		print '<do label="Cours precedent" type="accept"><go href="#card'.($i-1).'"/></do>' if ($i>1);
		print '<do label="Sommaire" type="accept"><go href="#home"/></do>';
		print "\n		</card>\n\n";
	}
print '</wml>';
}
#______________________________________________________________ print wml end __



#_________________________________________________________________ PRINT ICAL __
sub print_ical()
{
print <<"END_OF_BLOCK";
Content-type: text/calendar

BEGIN:VCALENDAR
PROID:-//LalaCoincoin usefule//NONSGML Tempis//EN
END_OF_BLOCK

	my $d; #jour de la semaine (numero)
	for $d (0 .. $#daylist)
	{
		my @monday;    #date du lundi de la semaine, du type DD/MM/YYYY
		my $cdate;     #date du jour format iCal : yyyymmddThhmmss(Z)
		my $cduration; #duree du cours format iCal : (+|-)PdDThHmMsS

		# formatage pour iCal
		@monday = split('/',$date1);
		$monday[0] += $d;
		$monday[0] = '0'.$monday[0] if(length $monday[0] < 2);
		$monday[1] = '0'.$monday[1] if(length $monday[1] < 2);
		$cdate = 'DTSTART:'.$monday[2].$monday[1].$monday[0].'T';

		my $dd = $_[$d]; #tout les cours du jours
		my $c;           #cours pointé
		for $c (@$dd)
		{
			if (!($cduration = $c->{Duree})) {last;};
			
			my @chour = split('h',$c->{Debut}); # heure de debut du cours
			print<<END_OF_BLOCK;
BEGIN:VEVENT
CLASS:PUBLIC
TRANSP:OPAQUE
UID:TEMPIS$monday[0]$monday[1]$monday[2]$chour[0]$chour[1]$c->{Type}
LOCATION:$c->{Salle}
$cdate$chour[0]$chour[1]00
END_OF_BLOCK
print 'DURATION:PT'.(uc $cduration)."\n";
print 'CATEGORIES:'.(uc $c->{Type})."\n" if($c->{Type});
print 'SUMMARY:'.$c->{Nom}.' en '.$c->{Salle}; print '\, groupe '.$c->{Groupe} if($c->{Groupe});print "\n";
print 'DESCRIPTION:'.$c->{Type}.' '.$c->{Module}.'\nSalle : '.$c->{Salle}; print '\nGroupe : '.$c->{Groupe} if($c->{Groupe}); print '\n('.$c->{Nom}.")\n";
print 'END:VEVENT'."\n";
# oui les '\n' ne sont pas interprétés, c'est normale, ne pas toucher à ça.
		}
	}
	print "END:VCALENDAR\n";
}
#_____________________________________________________________ print ical end __


#__________________________________________________________________ PRINT XML __
sub print_xml()
{
	print<<"END_OF_BLOCK";
Content-type: text/xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tempis SYSTEM "tempis.dtd">
<tempis>
END_OF_BLOCK
my $d;
for $d (0 .. $#daylist)
{
	my $current = (($weekshift==0)&&($d==(-1+$wday))) ? 'current="current"' : '';
	print "\t".'<day id="'.$d.'" '.$current.'>'."\n";
	
	my $dd = $_[$d];
	my $c;
	for $c (@$dd)
	{
		print "\t\t".'<teaching';
	   print	' position="'.$c->{Slotpos}.'"' if ($c->{Slotpos});
		print ' count="'.$c->{Slotcount}.'"' if ($c->{Slotcount});
		print ">\n";

		print "\t\t\t".'<name>'.$c->{Nom}.'</name>'."\n" if($c->{Nom});
		print "\t\t\t".'<module>'.$c->{Module}.'</module>'."\n";    
		
		print "\t\t\t".'<begin>'.$c->{Debut}.'</begin>'."\n";
		print "\t\t\t".'<standing>'.$c->{Duree}.'</standing>'."\n";
		
		print "\t\t\t".'<type>'.$c->{Type}.'</type>'."\n" if ($c->{Type});
		print "\t\t\t".'<location>'.$c->{Salle}.'</location>'."\n" if ($c->{Salle});
		print "\t\t\t".'<group>'.$c->{Groupe}.'</group>'."\n" if ($c->{Groupe});
		
		print "\t\t".'</teaching>'."\n";
	}
	print "\t".'</day>'."\n";
}
print '</tempis>'."\n";
}
#______________________________________________________________ print xml end __


#________________________________________________________________ PRINT IMODE __
sub print_imode()
{
	#use encoding "iso-8859-1";
	
	my $d  = $wday -1;
	my $dd = $_[$d];  # les cours du jour
	my $c;

	print <<"END_OF_BLOCK";
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">
<html>
	<head>
		<meta http-equiv="Content-type" content="text/html;charset=iso-8859-1">
		<title>$diplome - $daylist[$d]</title>
	</head>

	<body>
		<h1>$diplome - $daylist[$d]</h1>
		<dir>
			<li>#&59106;<a href="#1" accesskey="1">08h00 - 09h30</a></li>
			<li>#&59107;<a href="#2" accesskey="2">09h45 - 11h15</a></li>
			<li>#&59108;<a href="#3" accesskey="3">11h30 - 13h00</a></li>
			<li>#&59109;<a href="#4" accesskey="4">13h15 - 14h45</a></li>
			<li>#&59110;<a href="#5" accesskey="5">15h00 - 16h30</a></li>
			<li>#&59111;<a href="#6" accesskey="6">16h45 - 18h15</a></li>
			<li>#&59112;<a href="#7" accesskey="7">18h30 - 20h00</a></li>
		</dir>
END_OF_BLOCK
	
	my $ihour = 0;
	for $c (@$dd)
	{
		my $cbegin = $c->{Debut};
		if ($ihour<1 && $cbegin<"09h45")
		{
			print "\t\t".'<h2 id="1">08h00 - 09h30</h2>'."\n";
			$ihour = 1;
		}
		elsif ($ihour<2 && $cbegin>="09h45" && $cbegin<"11h30")
		{
			print "\t\t".'<h2 id="2">09h45 - 11h15</h2>'."\n";
			$ihour = 2;
		}
		elsif ($ihour<3 && $cbegin>="11h30" && $cbegin<"13h15")
		{
			print "\t\t".'<h2 id="3">11h30 - 13h00</h2>'."\n";
			$ihour = 3;
		}
		elsif ($ihour<4 && $cbegin>="13h15" && $cbegin<"15h00")
		{
			print "\t\t".'<h2 id="4">13h15 - 14h45</h2>'."\n";
			$ihour = 4;
		}
		elsif ($ihour<5 && $cbegin>="15h00" && $cbegin<"16h45")
		{
			print "\t\t".'<h2 id="5">15h00 - 16h30</h2>'."\n";
			$ihour = 5;
		}
		elsif ($ihour<6 && $cbegin>="16h45" && $cbegin<"18h30")
		{
			print "\t\t".'<h2 id="6">16h45 - 18h15</h2>'."\n";
			$ihour = 6;
		}
		elsif ($ihour<7 && $cbegin>="18h30")
		{
			print "\t\t".'<h2 id="7">18h30 - 20h00</h2>'."\n";
			$ihour = 7;
		}

		print<<"END_OF_BLOCK";
	<dl>
		<dt>$c->{Debut}</dt>
		<dd>Module : $c->{Module}</dd>
		<dd>Salle  : $c->{Salle}</dd>
END_OF_BLOCK
		print	"\t<dd>Groupe : ".$c->{Groupe}."</dd>\n" if($c->{Groupe});
		print<<"END_OF_BLOCK";
		<dd>Type   : $c->{Type}</dd>
		<dd>Duree  : $c->{Duree}</dd>
		<dd>Nom    : $c->{Nom}</dd>
	</dl>
END_OF_BLOCK
	}
	print "	<body>\n</html>";
}
#____________________________________________________________ print imode end __


#_________________________________________________________________ PRINT YAML __
#sub print_yaml()
#{
#}
#_____________________________________________________________ print yaml end __
